package com.proyecto.track.dao;

import java.util.List;
import java.util.Set;

import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.annotation.Transactional;

import com.proyecto.track.bo.Proyecto;
import com.proyecto.track.bo.DynamicQueryProyecto;
import com.proyecto.track.bo.Tarea;

// TODO: Auto-generated Javadoc
/**
 * The Class ProyectoDAOImp.
 */
@Transactional(rollbackFor = Exception.class)
public class ProyectoDAOImp extends HibernateDaoSupport implements ProyectoDAO {

	/**
	 * Inits the session factory.
	 * 
	 * @param factory
	 *            the factory
	 */
	@Autowired
	public void initSessionFactory(SessionFactory factory) {
		setSessionFactory(factory);
	}

	/* (non-Javadoc)
	 * @see com.proyecto.track.dao.ProyectoDAO#guardarProyecto(com.proyecto.track.bo.Proyecto)
	 */
	public Long guardarProyecto(Proyecto proyecto) {
		super.getHibernateTemplate().save(proyecto);
		return proyecto.getIdProyecto();
	}

	/* (non-Javadoc)
	 * @see com.proyecto.track.dao.ProyectoDAO#actualizarProyecto(com.proyecto.track.bo.Proyecto)
	 */
	public void actualizarProyecto(Proyecto proyecto) {
		super.getHibernateTemplate().update(proyecto);
	}

	/* (non-Javadoc)
	 * @see com.proyecto.track.dao.ProyectoDAO#borrarProyecto(java.lang.Long)
	 */
	public void borrarProyecto(Long id) {
		Proyecto p = (Proyecto) super.getHibernateTemplate().load(
				Proyecto.class, id);
		super.getHibernateTemplate().delete(p);
	}

	/* (non-Javadoc)
	 * @see com.proyecto.track.dao.ProyectoDAO#getProyectoById(java.lang.Long)
	 */
	public Proyecto getProyectoById(Long id) {
		return (Proyecto) super.getHibernateTemplate().get(Proyecto.class, id);
	}

	@SuppressWarnings("unchecked")
	public List<Proyecto> getAllProyectos() {
		return super.getHibernateTemplate().find("from Proyecto");
	}

	/**
	 * Gets the tareas proyecto.
	 * 
	 * @param proyectoId
	 *            the proyecto id
	 * @return the tareas proyecto
	 */
	public Set<Tarea> getTareasProyecto(Long proyectoId) {
		return getProyectoById(proyectoId).getTareas();
	}

	/* (non-Javadoc)
	 * @see com.proyecto.track.dao.ProyectoDAO#buscarProyectos(com.proyecto.track.bo.Proyecto)
	 */
	@SuppressWarnings("unchecked")
	public List<Proyecto> buscarProyectosDinamico(Proyecto proyecto) {

		Example example = Example.create(proyecto).excludeZeroes() // exclude zero valued properties
				.ignoreCase() // perform case insensitive string comparisons
				.enableLike(); // use like for string comparisons

		DetachedCriteria criteria = DetachedCriteria
				.forClass(Proyecto.class);
		criteria.add(example);
		return getHibernateTemplate().findByCriteria(criteria);

	}

	/* (non-Javadoc)
	 * @see com.proyecto.track.dao.ProyectoDAO#getProyectosForUsuario(java.lang.Long)
	 */
	@SuppressWarnings("unchecked")
	public List<Proyecto> getProyectosForUsuario(Long idUsuario) {

		return super.getHibernateTemplate().find("select u.Proyectos from Usuario as u where u.idUsuario = :idUsuario");

	}

}
